#include <stdio.h>

/*
 * 在虚函数表中放置非虚函数	P131
 */
class A
{
	public:
		virtual void f(void) {
			printf("A_f\n");
		}
};

class B
{
	public:
		virtual void f(void) {
			printf("B_f\n");
		}
		virtual void g(void) {
			printf("B_g\n");
		}
};


class C:public A, public B
{
	public:
		void f(void) {
			printf("Nonvirtual C_f\n");
		}
};

int main()
{
    A *a = new A;
	B *b = new B;
	C *c = new C;

    a->f();
	b->f();
	b->g();
	c->f();

    return 0;
}

/*
	A_f
	B_f
	B_g
	Nonvirtual C_f
 */

#if 0
/*
 * intel
 */
0000000000001169 <main>:
    1169:	f3 0f 1e fa          	endbr64 
    116d:	55                   	push   %rbp
    116e:	48 89 e5             	mov    %rsp,%rbp
    1171:	53                   	push   %rbx
    1172:	48 83 ec 28          	sub    $0x28,%rsp	// rsp-=0x28
    1176:	bf 08 00 00 00       	mov    $0x8,%edi	// edi=8
    117b:	e8 e0 fe ff ff       	callq  1060 <_Znwm@plt>	// new(8)
    1180:	48 89 c3             	mov    %rax,%rbx	// rbx=rax=return value
    1183:	48 89 df             	mov    %rbx,%rdi	// rdi=rbx=this
    1186:	e8 1d 01 00 00       	callq  12a8 <_ZN1AC1Ev>	// A(rdi)
    118b:	48 89 5d d8          	mov    %rbx,-0x28(%rbp)	// rbp-0x28=rbx=this
    118f:	bf 08 00 00 00       	mov    $0x8,%edi	// edi=8
    1194:	e8 c7 fe ff ff       	callq  1060 <_Znwm@plt>	// new(8)
    1199:	48 89 c3             	mov    %rax,%rbx	// rbx=rax=reutrn value=this
    119c:	48 89 df             	mov    %rbx,%rdi	// rdi=rbx
    119f:	e8 22 01 00 00       	callq  12c6 <_ZN1BC1Ev>	// B(rdi)
    11a4:	48 89 5d e0          	mov    %rbx,-0x20(%rbp)	// rbp-0x20=rbx
    11a8:	bf 10 00 00 00       	mov    $0x10,%edi	// edi=0x10
    11ad:	e8 ae fe ff ff       	callq  1060 <_Znwm@plt>	// new(edi)
    11b2:	48 89 c3             	mov    %rax,%rbx	// rbx=rax
    11b5:	48 89 df             	mov    %rbx,%rdi	// rdi=rbx=this
    11b8:	e8 27 01 00 00       	callq  12e4 <_ZN1CC1Ev>	// C(rdi)
    11bd:	48 89 5d e8          	mov    %rbx,-0x18(%rbp)	// rbp-0x18=rbx
    11c1:	48 8b 45 d8          	mov    -0x28(%rbp),%rax	// rax=rbp-0x28
    11c5:	48 8b 00             	mov    (%rax),%rax	// rax=(rax)
    11c8:	48 8b 10             	mov    (%rax),%rdx	// rdx=((rax))
    11cb:	48 8b 45 d8          	mov    -0x28(%rbp),%rax	// rax=rbp-0x28
    11cf:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    11d2:	ff d2                	callq  *%rdx		// rdx(rdi)
    11d4:	48 8b 45 e0          	mov    -0x20(%rbp),%rax	// rax=rbx-0x20
    11d8:	48 8b 00             	mov    (%rax),%rax	// rax=(rax)
    11db:	48 8b 10             	mov    (%rax),%rdx	// rdx=((rax))
    11de:	48 8b 45 e0          	mov    -0x20(%rbp),%rax	// rax=rbp-0x20
    11e2:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    11e5:	ff d2                	callq  *%rdx		// rdx(rdi)
    11e7:	48 8b 45 e0          	mov    -0x20(%rbp),%rax	// rax=rbp-0x20
    11eb:	48 8b 00             	mov    (%rax),%rax	// rax=(rax)
    11ee:	48 83 c0 08          	add    $0x8,%rax	// rax=(rax)+8
    11f2:	48 8b 10             	mov    (%rax),%rdx	// rdx=((rax)+8)
    11f5:	48 8b 45 e0          	mov    -0x20(%rbp),%rax	// rax=rbp-0x20
    11f9:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    11fc:	ff d2                	callq  *%rdx		// rdx(rdi)
    11fe:	48 8b 45 e8          	mov    -0x18(%rbp),%rax	// rax=rbp-0x18
    1202:	48 8b 00             	mov    (%rax),%rax	// rax=(rax)
    1205:	48 8b 10             	mov    (%rax),%rdx	// rdx=((rax))
    1208:	48 8b 45 e8          	mov    -0x18(%rbp),%rax	// rax=rbp-0x18
    120c:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    120f:	ff d2                	callq  *%rdx		// rdx(rdi)
    1211:	b8 00 00 00 00       	mov    $0x0,%eax	// eax=0
    1216:	48 83 c4 28          	add    $0x28,%rsp
    121a:	5b                   	pop    %rbx
    121b:	5d                   	pop    %rbp
    121c:	c3                   	retq   
    121d:	90                   	nop

000000000000121e <_ZN1A1fEv>:
    121e:	f3 0f 1e fa          	endbr64 
    1222:	55                   	push   %rbp
    1223:	48 89 e5             	mov    %rsp,%rbp
    1226:	48 83 ec 10          	sub    $0x10,%rsp	// rsp-=0x10
    122a:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    122e:	48 8d 3d cf 0d 00 00 	lea    0xdcf(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>	// rdi=rip+0xdcf
    1235:	e8 36 fe ff ff       	callq  1070 <puts@plt>	// puts(rdi)
    123a:	90                   	nop
    123b:	c9                   	leaveq 
    123c:	c3                   	retq   
    123d:	90                   	nop

000000000000123e <_ZN1B1fEv>:
    123e:	f3 0f 1e fa          	endbr64 
    1242:	55                   	push   %rbp
    1243:	48 89 e5             	mov    %rsp,%rbp	// rbp=rsp
    1246:	48 83 ec 10          	sub    $0x10,%rsp	// rsp-=0x10
    124a:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    124e:	48 8d 3d b3 0d 00 00 	lea    0xdb3(%rip),%rdi        # 2008 <_IO_stdin_used+0x8> // rdi=rip+0xdb3
    1255:	e8 16 fe ff ff       	callq  1070 <puts@plt>	// puts(rdi)
    125a:	90                   	nop
    125b:	c9                   	leaveq 
    125c:	c3                   	retq   
    125d:	90                   	nop

000000000000125e <_ZN1B1gEv>:
    125e:	f3 0f 1e fa          	endbr64 
    1262:	55                   	push   %rbp
    1263:	48 89 e5             	mov    %rsp,%rbp
    1266:	48 83 ec 10          	sub    $0x10,%rsp
    126a:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    126e:	48 8d 3d 97 0d 00 00 	lea    0xd97(%rip),%rdi        # 200c <_IO_stdin_used+0xc>
    1275:	e8 f6 fd ff ff       	callq  1070 <puts@plt>
    127a:	90                   	nop
    127b:	c9                   	leaveq 
    127c:	c3                   	retq   
    127d:	90                   	nop

000000000000127e <_ZN1C1fEv>:
    127e:	f3 0f 1e fa          	endbr64 
    1282:	55                   	push   %rbp
    1283:	48 89 e5             	mov    %rsp,%rbp
    1286:	48 83 ec 10          	sub    $0x10,%rsp
    128a:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    128e:	48 8d 3d 7b 0d 00 00 	lea    0xd7b(%rip),%rdi        # 2010 <_IO_stdin_used+0x10>
    1295:	e8 d6 fd ff ff       	callq  1070 <puts@plt>
    129a:	90                   	nop
    129b:	c9                   	leaveq 
    129c:	c3                   	retq   

000000000000129d <_ZThn8_N1C1fEv>:
    129d:	f3 0f 1e fa          	endbr64 
    12a1:	48 83 ef 08          	sub    $0x8,%rdi	// rdi-=0x8
    12a5:	eb d7                	jmp    127e <_ZN1C1fEv>
    12a7:	90                   	nop

00000000000012a8 <_ZN1AC1Ev>:
    12a8:	f3 0f 1e fa          	endbr64 
    12ac:	55                   	push   %rbp
    12ad:	48 89 e5             	mov    %rsp,%rbp
    12b0:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    12b4:	48 8d 15 95 2a 00 00 	lea    0x2a95(%rip),%rdx        # 3d50 <_ZTV1A+0x10>	// rdx=rip+0x2a95
    12bb:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    12bf:	48 89 10             	mov    %rdx,(%rax)	// (rax)=rdx
    12c2:	90                   	nop
    12c3:	5d                   	pop    %rbp
    12c4:	c3                   	retq   
    12c5:	90                   	nop

00000000000012c6 <_ZN1BC1Ev>:
    12c6:	f3 0f 1e fa          	endbr64 
    12ca:	55                   	push   %rbp
    12cb:	48 89 e5             	mov    %rsp,%rbp
    12ce:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    12d2:	48 8d 15 57 2a 00 00 	lea    0x2a57(%rip),%rdx        # 3d30 <_ZTV1B+0x10>	// rdx=rip+0x2a57
    12d9:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    12dd:	48 89 10             	mov    %rdx,(%rax)	// (rax)=rdx
    12e0:	90                   	nop
    12e1:	5d                   	pop    %rbp
    12e2:	c3                   	retq   
    12e3:	90                   	nop

00000000000012e4 <_ZN1CC1Ev>:
    12e4:	f3 0f 1e fa          	endbr64 
    12e8:	55                   	push   %rbp
    12e9:	48 89 e5             	mov    %rsp,%rbp	// rbp=rsp
    12ec:	48 83 ec 10          	sub    $0x10,%rsp	// rsp-=0x10
    12f0:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    12f4:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    12f8:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    12fb:	e8 a8 ff ff ff       	callq  12a8 <_ZN1AC1Ev>	// A(rdi)
    1300:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    1304:	48 83 c0 08          	add    $0x8,%rax	// rax+=8
    1308:	48 89 c7             	mov    %rax,%rdi	// rdi=rax
    130b:	e8 b6 ff ff ff       	callq  12c6 <_ZN1BC1Ev>	// B(rdi)
    1310:	48 8d 15 e1 29 00 00 	lea    0x29e1(%rip),%rdx        # 3cf8 <_ZTV1C+0x10>	// rdx=rip+0x28e1
    1317:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    131b:	48 89 10             	mov    %rdx,(%rax)	// (rax)=rdx
    131e:	48 8d 15 eb 29 00 00 	lea    0x29eb(%rip),%rdx        # 3d10 <_ZTV1C+0x28>	// rdx=rip+0x28eb
    1325:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	// rax=rbp-0x8
    1329:	48 89 50 08          	mov    %rdx,0x8(%rax)	// (rax)+8=rdx
    132d:	90                   	nop
    132e:	c9                   	leaveq 
    132f:	c3                   	retq

/*
 * arm
 */
000000000040077c <main>:
  40077c:	a9bc7bfd 	stp	x29, x30, [sp, #-64]!
  400780:	910003fd 	mov	x29, sp
  400784:	f9000bf3 	str	x19, [sp, #16]		// sp+16=x19
  400788:	d2800100 	mov	x0, #0x8                   	// #8
  40078c:	97ffffb9 	bl	400670 <_Znwm@plt>	// new(8)
  400790:	aa0003f3 	mov	x19, x0			// x19=x0=return value
  400794:	aa1303e0 	mov	x0, x19			// x0=x19
  400798:	9400004d 	bl	4008cc <_ZN1AC1Ev>	// A(x0)
  40079c:	f9001fb3 	str	x19, [x29, #56]		// x29+56=x19
  4007a0:	d2800100 	mov	x0, #0x8                   	// #8
  4007a4:	97ffffb3 	bl	400670 <_Znwm@plt>	// new(8)
  4007a8:	aa0003f3 	mov	x19, x0			// x19=x0
  4007ac:	aa1303e0 	mov	x0, x19			// x0=x19
  4007b0:	94000050 	bl	4008f0 <_ZN1BC1Ev>	// B(x0)
  4007b4:	f9001bb3 	str	x19, [x29, #48]		// x29+48=x19
  4007b8:	d2800200 	mov	x0, #0x10                  	// #16
  4007bc:	97ffffad 	bl	400670 <_Znwm@plt>	// new(16)
  4007c0:	aa0003f3 	mov	x19, x0			// x19=x0
  4007c4:	aa1303e0 	mov	x0, x19			// x0=x19
  4007c8:	94000053 	bl	400914 <_ZN1CC1Ev>	// C(x0)
  4007cc:	f90017b3 	str	x19, [x29, #40]		// x29+40=x19
  4007d0:	f9401fa0 	ldr	x0, [x29, #56]		// x0=x29+56
  4007d4:	f9400000 	ldr	x0, [x0]		// x0=(x0)
  4007d8:	f9400001 	ldr	x1, [x0]		// x1=((x0))
  4007dc:	f9401fa0 	ldr	x0, [x29, #56]		// x0=x29+56
  4007e0:	d63f0020 	blr	x1			// x1(x0)
  4007e4:	f9401ba0 	ldr	x0, [x29, #48]		// x0=x29+48
  4007e8:	f9400000 	ldr	x0, [x0]		// x0=(x0)
  4007ec:	f9400001 	ldr	x1, [x0]		// x1=((x0))
  4007f0:	f9401ba0 	ldr	x0, [x29, #48]		// x0=x29+48
  4007f4:	d63f0020 	blr	x1			// x1(x0)
  4007f8:	f9401ba0 	ldr	x0, [x29, #48]		// x0=x29+48
  4007fc:	f9400000 	ldr	x0, [x0]		// x0=(x0)
  400800:	91002000 	add	x0, x0, #0x8		// x0=(x0)+8
  400804:	f9400001 	ldr	x1, [x0]		// x1=((x0)+8)
  400808:	f9401ba0 	ldr	x0, [x29, #48]		// x0=x29+48
  40080c:	d63f0020 	blr	x1			// x1(x0)
  400810:	f94017a0 	ldr	x0, [x29, #40]		// x0=x29+40
  400814:	f9400000 	ldr	x0, [x0]		// x0=(x0)
  400818:	f9400001 	ldr	x1, [x0]		// x1=((x0))
  40081c:	f94017a0 	ldr	x0, [x29, #40]		// x0=x29+40
  400820:	d63f0020 	blr	x1			// x1(x0)
  400824:	52800000 	mov	w0, #0x0                   	// #0
  400828:	f9400bf3 	ldr	x19, [sp, #16]
  40082c:	a8c47bfd 	ldp	x29, x30, [sp], #64
  400830:	d65f03c0 	ret

0000000000400834 <_ZN1A1fEv>:
  400834:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400838:	910003fd 	mov	x29, sp
  40083c:	f9000fa0 	str	x0, [x29, #24]		// x29+24=x0
  400840:	90000000 	adrp	x0, 400000 <_init-0x5f8>	// x0=400000
  400844:	91284000 	add	x0, x0, #0xa10		// x0=400a10
  400848:	97ffff86 	bl	400660 <puts@plt>	// puts(x0)
  40084c:	d503201f 	nop
  400850:	a8c27bfd 	ldp	x29, x30, [sp], #32
  400854:	d65f03c0 	ret

0000000000400858 <_ZN1B1fEv>:
  400858:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  40085c:	910003fd 	mov	x29, sp
  400860:	f9000fa0 	str	x0, [x29, #24]
  400864:	90000000 	adrp	x0, 400000 <_init-0x5f8>
  400868:	91286000 	add	x0, x0, #0xa18
  40086c:	97ffff7d 	bl	400660 <puts@plt>	// puts(x0)
  400870:	d503201f 	nop
  400874:	a8c27bfd 	ldp	x29, x30, [sp], #32
  400878:	d65f03c0 	ret

000000000040087c <_ZN1B1gEv>:
  40087c:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400880:	910003fd 	mov	x29, sp
  400884:	f9000fa0 	str	x0, [x29, #24]
  400888:	90000000 	adrp	x0, 400000 <_init-0x5f8>
  40088c:	91288000 	add	x0, x0, #0xa20
  400890:	97ffff74 	bl	400660 <puts@plt>
  400894:	d503201f 	nop
  400898:	a8c27bfd 	ldp	x29, x30, [sp], #32
  40089c:	d65f03c0 	ret

00000000004008a0 <_ZN1C1fEv>:
  4008a0:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  4008a4:	910003fd 	mov	x29, sp
  4008a8:	f9000fa0 	str	x0, [x29, #24]
  4008ac:	90000000 	adrp	x0, 400000 <_init-0x5f8>
  4008b0:	9128a000 	add	x0, x0, #0xa28
  4008b4:	97ffff6b 	bl	400660 <puts@plt>
  4008b8:	d503201f 	nop
  4008bc:	a8c27bfd 	ldp	x29, x30, [sp], #32
  4008c0:	d65f03c0 	ret

00000000004008c4 <_ZThn8_N1C1fEv>:
  4008c4:	d1002000 	sub	x0, x0, #0x8
  4008c8:	17fffff6 	b	4008a0 <_ZN1C1fEv>

00000000004008cc <_ZN1AC1Ev>:
  4008cc:	d10043ff 	sub	sp, sp, #0x10
  4008d0:	f90007e0 	str	x0, [sp, #8]			// sp+8=x0
  4008d4:	90000000 	adrp	x0, 400000 <_init-0x5f8>	// x0=400000
  4008d8:	912a8001 	add	x1, x0, #0xaa0			// x1=400aa0
  4008dc:	f94007e0 	ldr	x0, [sp, #8]			// x0=sp+8
  4008e0:	f9000001 	str	x1, [x0]			// (x0)=x1
  4008e4:	d503201f 	nop
  4008e8:	910043ff 	add	sp, sp, #0x10
  4008ec:	d65f03c0 	ret

00000000004008f0 <_ZN1BC1Ev>:
  4008f0:	d10043ff 	sub	sp, sp, #0x10
  4008f4:	f90007e0 	str	x0, [sp, #8]			// sp+8=x0
  4008f8:	90000000 	adrp	x0, 400000 <_init-0x5f8>	
  4008fc:	912a0001 	add	x1, x0, #0xa80			// x1=400a80
  400900:	f94007e0 	ldr	x0, [sp, #8]			// x0=sp+8
  400904:	f9000001 	str	x1, [x0]			// (x0)=x1
  400908:	d503201f 	nop
  40090c:	910043ff 	add	sp, sp, #0x10
  400910:	d65f03c0 	ret

0000000000400914 <_ZN1CC1Ev>:
  400914:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400918:	910003fd 	mov	x29, sp				// x29=sp
  40091c:	f9000fa0 	str	x0, [x29, #24]			// x29+24=x0
  400920:	f9400fa0 	ldr	x0, [x29, #24]			// x0=x29+24
  400924:	97ffffea 	bl	4008cc <_ZN1AC1Ev>		// A(x0)
  400928:	f9400fa0 	ldr	x0, [x29, #24]			// x0=x29+24
  40092c:	91002000 	add	x0, x0, #0x8			// x0=x0+8
  400930:	97fffff0 	bl	4008f0 <_ZN1BC1Ev>		// B(x0)
  400934:	90000000 	adrp	x0, 400000 <_init-0x5f8>	// x0=400000
  400938:	91292001 	add	x1, x0, #0xa48			// x1=400a48
  40093c:	f9400fa0 	ldr	x0, [x29, #24]			// x0=x29+24
  400940:	f9000001 	str	x1, [x0]			// (x0)=x1
  400944:	90000000 	adrp	x0, 400000 <_init-0x5f8>	// x0=400000
  400948:	91298001 	add	x1, x0, #0xa60			// x1=400a60
  40094c:	f9400fa0 	ldr	x0, [x29, #24]			// x0=x29+24
  400950:	f9000401 	str	x1, [x0, #8]			// (x0+8)=x1
  400954:	d503201f 	nop
  400958:	a8c27bfd 	ldp	x29, x30, [sp], #32
  40095c:	d65f03c0 	ret

#endif
